package methodarea;

import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;

/**
 * @author ZhengDp
 * @Date 2023/5/12 16:19
 * @deprecated 演示元空间内存溢出  -XX:MaxMetaspaceSize=8m
 */
public class MethodArea_Demo1 extends ClassLoader{ // ClassLoader : 用来加载类的二进制字节码
    public static void main(String[] args) {
        int j =0;
        try {
            MethodArea_Demo1 test = new MethodArea_Demo1();
            for (int i = 0; i < 10000; i++) {
                // ClassWriter ： 生成类的二进制字节码
                ClassWriter cw = new ClassWriter(0);
                /*
                * Opcodes.V1_8 ： 版本号
                * Opcodes.ACC_PUBLIC ： 访问修饰符
                * 类名 包名  父类  接口
                * */
                cw.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"Class" + i , null,"java/lang/Object",null);
                // 返回类的 byte[]
                byte[] code = cw.toByteArray();
                // 触发类的加载（执行了类的加载）
                test.defineClass("Class" +i,code,0,code.length);
            }
        } finally {
            System.out.println(j);
        }
    }
}
